<?php

namespace app\Admin\model;

use Firebase\JWT\JWT as JWTUtils;
use Firebase\JWT\Key;
use think\exception\ValidateException;
use think\facade\Env;
use think\Model;
use Firebase\JWT\ExpiredException;
use \app\Admin\validate\Admin as AdminValidate;

class Admin extends Model
{
    // 新增管理员
    public static function add_admin($data)
    {
        // 数据验证(对data数据进行验证)
        try {
            // 根据场景验证scene
            validate(AdminValidate::class)->scene('add_admin')->check($data);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return return_msg(-1, $e->getError());
        }

        // 新增数据
        $res = self::create([
            'username' => $data['username'],
            'password' => md5($data['password']),
            'phone' => $data['phone'],
            'email' => $data['email'],
            'role' => $data['role'],
            'add_time' => time(),
            'status' => $data['status'],
        ]);

        if ($res) {
            return return_msg(1, '添加成功');
        } else {
            return return_msg(-1, '添加失败');
        }
    }

    // 查询管理员列表
    public static function get_admin()
    {
        $admins = self::select();
        $listdata = $admins->toArray();
        return return_msg(1, '查询成功', $listdata);
    }

    // 删除管理员
    public static function del_admin($data)
    {
        // 数据验证(对data数据进行验证)
        try {
            // 根据场景验证scene
            validate(AdminValidate::class)->scene('del_admin')->check($data);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return return_msg(-1, $e->getError());
        }
        $id = $data['id'];
        $res = self::where('id', $id)->delete();
        if ($res == 1) {
            return return_msg(1, '删除成功');
        } else {
            return return_msg(-1, '删除失败');
        }

    }

    // 修改管理员
    public static function edit_admin($data)
    {
        try {
            validate(AdminValidate::class)->scene('update_admin')->check($data);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return return_msg(-1, $e->getError());
        }

        // 先查询当前数据是否存在
        $sel = self::find($data['id']);
        if ($sel) {
            // 修改数据
            $res = self::update($data);
            if ($res) {
                return return_msg(1, '修改成功');
            } else {
                return return_msg(-1, '修改失败');
            }
        } else {
            return return_msg(-1, '该用户不存在');
        }
    }


    // 管理员登录
    public static function login_admin($data)
    {
        // 数据验证(对data数据进行验证)
        try {
            // 根据场景验证scene
            validate([
                'username' => 'require',
                'password' => 'require|min:6|max:16',
            ], [
                'username.require' => '管理员名称必须填写',
                'password.require' => '密码必须填写',
                'password.min' => '密码不能少于6个字符',
                'password.max' => '密码不能超过16个字符',
            ])->check($data);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return return_msg(-1, $e->getError());
        }

        // 查找数据
        $sel_data = self::where(['username' => $data['username'], 'password' => md5($data['password'])])->find();
        if ($sel_data) {
            // 使用JWT返回令牌
            // 存在则校验账号密码
            $token = self::create_token($sel_data);

            $sel_data['token'] = $token;
            return return_msg(1, '登陆成功', $sel_data);
        } else {
            return return_msg(-1, '账号不存在或密码错误');
        }
    }

    // 生成token, 使用jwt扩展库
    // 安装命令 composer require firebase/php-jwt
    public static function create_token($admin = [])
    {
        $key = md5(Env::get('JWT.jwt_secret_key')); // jwt签发秘钥
        $time = time(); // 签发时间
        $expire = $time + Env::get('JWT.expire_time'); // 过期时间
        $token = array(
            $admin,
            "iss" => "南京萧寂智匠软件", // 签发组织
            "aud" => "XIAOJI", // 签发作者
            "iat" => $time,
            "nbf" => $time,
            "exp" => $expire,
            "kid" => '1'
        );
        $jwt = JWTUtils::encode($token, $key, 'HS256');
        return $jwt;
    }
}